package goylc

// NFA 不确定的有限自动机
//

type GoylcNFA struct {
	states         []*GoylcState
	alphas         []GoylcAlpha
	jump_table     JumpTableNFA
	state_comparer StateOrderComparer
	start_state    GoylcStateId
	end_states     []GoylcStateId
}

func (nfa *GoylcNFA) CleanStateMark() {
	for idx := range nfa.states {
		nfa.states[idx].Marked = false
	}
}

func (nfa *GoylcNFA) GetStateById(id GoylcStateId) *GoylcState {
	for _, v := range nfa.states {
		if v.Id == id {
			return v
		}
	}
	return nil
}

// 定义 NFA
// states: 有穷状态集合 S
// alphas: 一个输入符号集合∑，即输入字母表（input alphabet）
// jump_table:  一个转换函数（transition function，也可以称为迁移函数），
//              为每个状态和∑∪{ε}中的每个符号都给出了相应的后继状态（next state）的集合
// start_state: 开始状态
// end_states: 终止状态集合
func defineNFA(states []*GoylcState, alphas []GoylcAlpha,
	jump_table JumpTableNFA,
	state_comparer StateOrderComparer,
	start_state GoylcStateId, end_states []GoylcStateId) *GoylcNFA {

	// 校验语法是否有问题
	// ...

	// 1. 开始状态和结束状态的ID是否在 state 中？

	// 2. 跳转状态表是否是可用的

	return &GoylcNFA{
		states:         states,
		alphas:         alphas,
		jump_table:     jump_table,
		state_comparer: stateOrderComparerDefault,
		start_state:    start_state,
		end_states:     end_states,
	}
}

func init() {
	cc := defineNFA
	print("aaaaaaaaaaaaaaaaaaa")
	print(cc)
}
